﻿

CREATE PROCEDURE [dbo].[amix_InchideLuna2] 
	-- Add the parameters for the stored procedure here
	@Luna smallint, 
	@An smallint,
	@CodUnitate smallint,
	@IDDocument int, --daca document e zero pe toate
	@InchideLuna bit --daca se inchide luna sau nu
AS
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	--SET NOCOUNT ON;
	-- numarul mijloacelor fixe cu acelasi numar de inventar
	DECLARE @MaxDurata int
	DECLARE @Index int
	DECLARE @Compus int
	DECLARE @UltimaZiLuna datetime
	DECLARE @LunaCurenta smallint 
	DECLARE @AnCurent smallint

	SELECT @LunaCurenta =LunaCurenta, @AnCurent=AnulCurent  FROM AmixSetup WHERE CodUnitate=@CodUnitate

	SET @UltimaZiLuna = DATEADD(day,-1,DATEADD(month,1,CAST(CAST(@An AS varchar(4)) + '-' + CAST(@Luna AS varchar(2)) + '-01' AS datetime)))
 
 
	IF @IDDocument=0
		SET @Compus = 1
	ELSE
		--daca documentul a fost sters le actualizeaza pe toate!
		SELECT @Compus = ISNULL([Compus],1) FROM [AmixDocumente] WHERE  [IDDocument]=@IDDocument	
	PRINT('Compus=' + cast(@Compus as varchar(2)))
	--sterge mijloacele fixe introduse in luna curenta
	BEGIN TRAN
	
	---sterge din tabela de amortizari inregistrarile generate
	-- daca suntem dupa luna curenta
	IF @AnCurent*12 + @LunaCurenta <= @An*12+@Luna
	BEGIN
		DELETE FROM [AmixAmortizare] WHERE [IDMijlocFix] IN (SELECT [IDMijlocFix] FROM [AmixRegistru]
			WHERE [CodUnitate]=@CodUnitate) AND [An] = @An AND [Luna]=@Luna
		IF @@ERROR <>0 GOTO Eroare  
	
		DELETE FROM [AmixRegistruBK] WHERE  [CodUnitate]=@CodUnitate AND [An] = @An AND [Luna]=@Luna
		IF @@ERROR <>0 GOTO Eroare  	

		---------------------------------------------------------------------------------------------------
		----------------------------------------Backup-----------------------------------------------------
		--- se salveaza toate mijloacele fixe
		INSERT INTO [AmixRegistruBK]
			   ([IDMijlocFix],[NrInventar],[Denumire],[ContAmortizare],[StocFaptic],[IDClasificare],[DataIntrare],[DataIesire],[CodUnitate],[IDDepartament],[IDStare]
				,[ContImobilizare],[ContCheltuiala],[DurataAmortizare],[RegimAmortizare],[ValoareInventar],[PunereInFunctiune],[Compus] ,[Blocat]
				,[IDGestionar],[ContTransfer],[ValoareAmortizata],[LuniAmortizate],[AmortizareLuna],[AmortizareAn],[InFolosinta],[CantitateOI]
				,[Categorie],[IDUnitateMasura],Luna,An,[ContTransferForSuperior],[IDJurnal],[ValoareIntrataTransfer],[IDSursaFinantare])
				SELECT [IDMijlocFix],[NrInventar],[Denumire],[ContAmortizare],[StocFaptic],[IDClasificare],[DataIntrare],[DataIesire],[CodUnitate],[IDDepartament],[IDStare]
				,[ContImobilizare],[ContCheltuiala],[DurataAmortizare],[RegimAmortizare],[ValoareInventar],[PunereInFunctiune],[Compus] ,[Blocat]
				,[IDGestionar],[ContTransfer],[ValoareAmortizata],[LuniAmortizate],[AmortizareLuna],[AmortizareAn],[InFolosinta],[CantitateOI]
				,[Categorie],[IDUnitateMasura],@LunaCurenta,@AnCurent,[ContTransferForSuperior],[IDJurnal],[ValoareIntrataTransfer],[IDSursaFinantare]
			   FROM [AmixRegistru] a 
			WHERE  [CodUnitate]=@CodUnitate 
		IF @@ERROR <>0 GOTO Eroare  	

		UPDATE [AmixDocumente] SET [IDBK] = b.[IDBK] FROM [AmixRegistruBK] b 
		WHERE [AmixDocumente].[NrInventar] = b.[NrInventar] AND [AmixDocumente].[CodUnitate] = b.[CodUnitate]
		IF @@ERROR <>0 GOTO Eroare  	

		----------------------------------------Backup-----------------------------------------------------
	
	END
	
	---------------------------------------------------------------------------------------------------

	--nu se pot sterge inregistrarile din registru pentru ca sunt legate de amortizare
	-- ele se updateaza mijloacele fixe existente
	-------------------------------------------------------------------------------
	UPDATE [AmixRegistru] 
			SET [NrInventar] = d.[NrInventar],
			[Denumire]=d.[Denumire],
			[ContAmortizare]=d.[ContAmortizare],
			[StocFaptic]=1,
			[IDClasificare]=d.[IDClasificare],
            [DataIntrare]=CASE WHEN d.Compus<3 THEN DATEADD(month,1,d.[PunereInFunctiune]) ELSE d.[DataDoc] END,
            [DataIesire]=DATEADD(month,d.[DurataAmortizare]-d.[LuniAmortizate],d.[PunereInFunctiune]),
			[CodUnitate]=@CodUnitate,
			[IDDepartament]=d.[IDDepartament],
			[IDStare]=5,
			[ContImobilizare]=d.[ContImobilizare],
			[ContCheltuiala]=d.[ContCheltuiala],
			[DurataAmortizare]=d.[DurataAmortizare],
			[RegimAmortizare]=d.[RegimAmortizare],
			[ValoareInventar]=d.[ValoareInventar],
			[PunereInFunctiune]=d.[PunereInFunctiune],[Compus]=d.[Compus],
			[IDGestionar]=d.[IDGestionar],
			[AmortizareLuna] = d.[AmortizareLuna],
			[AmortizareAn] = d.[AmortizareAn], -- de fapt este vorba de amortizarea in primul an
			[ValoareAmortizata] = d.ValoareAmortizata,
			[IDUnitateMasura] = d.[IDUnitateMasura],
			[CantitateOI] = d.CantitateOI,
			[InFolosinta] = d.[InFolosinta],
			[ContTransferForSuperior] = d.[ContTransferForSuperior],
			[IDSursaFinantare]=d.[IDSursaFinantare]
			FROM [AmixDocumente] d
	WHERE  
		d.[Anul] = @An AND d.[Luna]=@Luna AND d.[CodUnitate]=@CodUnitate AND d.[IDTipDocument]=2 AND d.[IDMijlocFix] = [AmixRegistru].[IDMijlocFix] AND d.[IDMijlocFix] IS NOT NULL
		AND (@IDDocument=0 OR [IDDocument]=@IDDocument)
	IF @@ERROR <>0 GOTO Eroare  	
	--pentru modernizare
	PRINT('actualizarile pentru modernizare in registru')
    --atentie se modifica si mortizarea lunara si Amorizarea anuala
	UPDATE [AmixRegistru] 
			SET [DurataAmortizare]=d.[DurataAmortizare]+ d.[DurExtindere],[ValoareInventar]=d.[ValoareInventar] + d.[ValoareSuplimentara],
            [AmortizareLuna] = CASE WHEN [AmixRegistru].[RegimAmortizare]= 1 THEN d.[AmortizareLuna]
				WHEN [AmixRegistru].[RegimAmortizare]= 2 THEN d.[AmortizareLuna]
				WHEN [AmixRegistru].[RegimAmortizare]= 3 THEN  -- accelerata
					CASE WHEN DATEDIFF(month,[AmixRegistru].[PunereInFunctiune],@UltimaZiLuna)<12 THEN d.[AmortizareLuna]
						 WHEN DATEDIFF(month,[AmixRegistru].[PunereInFunctiune],@UltimaZiLuna)=12 THEN d.[AmortizareAn] - d.[AmortizareLuna]*11
						ELSE (d.[ValoareInventar] - d.[ValoareAmortizata] - d.[AmortizareAn])/(d.[DurataAmortizare]-12)
					END 
				ELSE 0
				END
			FROM [AmixDocumente] d
	WHERE  
		d.[Anul] = @An AND d.[Luna]=@Luna AND d.[CodUnitate]=@CodUnitate AND d.[IDTipDocument]=8 AND d.[IDMijlocFix] = [AmixRegistru].[IDMijlocFix] AND d.[IDMijlocFix] IS NOT NULL
		AND (@IDDocument=0 OR [IDDocument]=@IDDocument)
	IF @@ERROR <>0 GOTO Eroare  

	--se adauga mfixe noi
	------------------------------------------------------------------------------
	PRINT('Adauga noi MF')
	INSERT INTO [AmixRegistru]
           ([NrInventar],[Denumire],[ContAmortizare],[StocFaptic],[IDClasificare]
           ,[DataIntrare],[DataIesire],[CodUnitate],[IDDepartament],[IDStare],[ContImobilizare],[ContCheltuiala],[DurataAmortizare],[RegimAmortizare],[ValoareInventar],
			[PunereInFunctiune],[Compus],[IDGestionar],[AmortizareLuna],[AmortizareAn],[ValoareAmortizata],[CantitateOI],[IDUnitateMasura],[InFolosinta])
	(SELECT [NrInventar],[Denumire],[ContAmortizare],1,[IDClasificare],
	 CASE WHEN Compus<3 THEN DATEADD(month,1,[PunereInFunctiune]) ELSE [PunereInFunctiune] END,
	 DATEADD(month,[DurataAmortizare],[PunereInFunctiune]),
	 @CodUnitate,[IDDepartament],5,[ContImobilizare],[ContCheltuiala],[DurataAmortizare],[RegimAmortizare],[ValoareInventar],
	 [PunereInFunctiune],[Compus],[IDGestionar],[AmortizareLuna],[AmortizareAn],[ValoareAmortizata],[CantitateOI],[IDUnitateMasura],[InFolosinta]
	 FROM [AmixDocumente] ad
	 WHERE [CodUnitate]=@CodUnitate AND [IDTipDocument]=2 AND [Anul]=@An AND [Luna]=@Luna
		AND ad.[IDMijlocFix] IS NULL
		AND (@IDDocument=0 OR [IDDocument]=@IDDocument)
		AND NOT EXISTS(SELECT * FROM AmixRegistru ar WHERE ar.CodUnitate=ad.CodUnitate AND ar.NrInventar=ad.NrInventar))
		
	IF @@ERROR <>0 GOTO Eroare  
	--------------------------------------------------------------------------------
	PRINT('Face legatura cu registrul pentru toate documentele')

	UPDATE [AmixDocumente] SET [IDMijlocFix] = a.[IDMijlocFix] FROM [AmixRegistru] a
		WHERE a.[NrInventar]=[AmixDocumente].[NrInventar] AND
			  [AmixDocumente].[CodUnitate]=@CodUnitate AND [AmixDocumente].[Anul]=@An AND [AmixDocumente].[Luna]=@Luna AND [AmixDocumente].[IDMijlocFix] IS NULL
			  AND (@IDDocument=0 OR [IDDocument]=@IDDocument)
	
	IF @@ERROR <>0 GOTO Eroare  

	--Procesare Mijloace fixe compuse
	-------------------------------------------------------------------------
	IF @Compus>=1
	BEGIN
		Print('Prelucrare mijloace fixe compuse')
		UPDATE [AmixRegistru]
		SET [DataIntrare]= a2.[DataIntrare],
			[DataIesire] = a2.[DataIesire],
			[ValoareInventar] = a2.[ValoareInventar],
			[DurataAmortizare] = a2.[DurataAmortizare],
			[PunereInFunctiune] = a2.[PunereInFunctiune]
		FROM (SELECT b.[IDMFixPrincipal] AS [IDMijlocFix], 
				MIN([PunereInFunctiune]) AS [PunereInFunctiune],
				DATEDIFF(month,MIN([DataIntrare]),MAX([DataIesire]))+1 AS [DurataAmortizare],			
				SUM([ValoareInventar]) AS [ValoareInventar],
				MAX([DataIesire]) AS [DataIesire],
				MIN([DataIntrare]) AS [DataIntrare]
				FROM [AmixRegistru] a JOIN [AmixAnsamble] b ON a.[IDMijlocFix] = b.[IDMfixComponenta] 
				WHERE a.[Compus] = 2
				GROUP BY b.[IDMFixPrincipal]) a2
		WHERE 
		[Compus] = 1 AND 
		[CodUnitate]=@CodUnitate AND 
		[AmixRegistru].[IDMijlocFix] = a2.[IDMijlocFix]
		
		IF @@ERROR <>0 GOTO Eroare
	END

	Print('Conservare mijloc fix')
	----Conservare mijloc fix----------------------------------------
	UPDATE [AmixRegistru] 
			SET [IDStare] = 6
			FROM [AmixDocumente] d
	WHERE  
			d.[Anul] = @An AND d.[Luna]=@Luna AND d.[CodUnitate]=@CodUnitate AND d.[IDTipDocument]=5 AND d.[IDMijlocFix] = [AmixRegistru].[IDMijlocFix] AND d.[IDMijlocFix] IS NOT NULL
			AND (@IDDocument=0 OR [IDDocument]=@IDDocument)
	IF @@ERROR <>0 GOTO Eroare  
	--------------------------------------------------------------------

	----Reactivare mijloc fix-------------------------------------------

	DECLARE @recalcul int
	SET @recalcul=0	
	Print('Reactivare mijloc fix')

	UPDATE [AmixRegistru] 
			SET [IDStare] = 5,
			[PunereInFunctiune] = d.[PunereInFunctiune]
			FROM [AmixDocumente] d
	WHERE  
			d.[Anul] = @An AND d.[Luna]=@Luna AND d.[CodUnitate]=@CodUnitate AND d.[IDTipDocument]=6 AND d.[IDMijlocFix] = [AmixRegistru].[IDMijlocFix] AND d.[IDMijlocFix] IS NOT NULL
			AND (@IDDocument=0 OR [IDDocument]=@IDDocument)
	IF @@ERROR <>0 GOTO Eroare  
	--------------------------------------------------------------------
	IF @AnCurent*12 + @LunaCurenta <= @An*12+@Luna
	BEGIN
		PRINT('Calcul Amortizare lunara si pentru ultima luna')
		-- generare amortizare  luna curenta pentru mijloace fixe obisnuite
		INSERT INTO [AmixAmortizare]
		   ([IDMijlocFix],[Luna],[An],[ValoareInventar],[ValoareAmortizata],[ValoareRamasa]
		   ,[AmortizareAn],[AmortizareLuna],[DurataNormata],[LuniAmortizate])	
		SELECT [IDMijlocFix],
		@Luna,@An,ar.[ValoareInventar],ar.ValoareAmortizata,ar.[ValoareInventar] - ar.ValoareAmortizata,ar.[AmortizareAn],
		ar.[AmortizareLuna],[DurataAmortizare],
		CASE WHEN (DATEDIFF(month,[PunereInFunctiune],@UltimaZiLuna)-1) < 0 THEN 0
		ELSE (DATEDIFF(month,[PunereInFunctiune],@UltimaZiLuna)-1) END -- numarul de luni amortizare
		FROM [AmixRegistru] ar
		WHERE [CodUnitate]=@CodUnitate AND [RegimAmortizare]<>0 AND [Compus]<>1
		AND ar.[IDMijlocFix] NOT IN (SELECT [IDMijlocFix] FROM [AmixDocumente] d
			WHERE  d.[Anul] = @An AND d.[Luna]=@Luna AND d.[CodUnitate]=@CodUnitate AND d.[IDTipDocument]=3 
			AND (@IDDocument=0 OR [IDDocument]=@IDDocument))
		AND ar.[IDStare]=5 AND (YEAR([PunereInFunctiune])*100+MONTH([PunereInFunctiune]) < YEAR(@UltimaZiLuna)*100+MONTH(@UltimaZiLuna))
		IF @@ERROR <>0 GOTO Eroare  	


		--generare amortizare mijloace compuse
		-----------------------------------------------------------------------------------
		
		IF @Compus >= 1
		BEGIN
			Print('Prelucrare amortizare mijloace fixe compuse')
			
			INSERT INTO [AmixAmortizare]
			   ([IDMijlocFix],[Luna],[An],[ValoareInventar],[ValoareAmortizata],[ValoareRamasa]
			   ,[AmortizareAn],[AmortizareLuna],[DurataNormata],[LuniAmortizate])
			(SELECT b.[IDMFixPrincipal],
				@Luna,@An,
				r1.[ValoareInventar],
				SUM(ISNULL(a.[ValoareAmortizata],0)), 
				SUM(ISNULL(a.[ValoareRamasa],r2.[ValoareInventar])),
				SUM(ISNULL(a.[AmortizareAn],0)),
				SUM(ISNULL(a.[AmortizareLuna],0)),
				r1.[DurataAmortizare],
				CASE WHEN DATEDIFF(month,r1.[PunereInFunctiune],@UltimaZiLuna)-1 < 0 THEN 0
					 ELSE DATEDIFF(month,r1.[PunereInFunctiune],@UltimaZiLuna)-1 END
			FROM [AmixAnsamble] b
				LEFT OUTER JOIN [AmixAmortizare] a   ON a.[IDMijlocFix] = b.[IDMfixComponenta] AND a.[Luna] = @Luna AND a.[An]=@An
				JOIN [AmixRegistru] r2 ON b.[IDMfixComponenta]  = r2.[IDMijlocFix] 
				JOIN [AmixRegistru] r1 ON b.[IDMFixPrincipal] = r1.[IDMijlocFix]
			WHERE 
				(YEAR(r1.[PunereInFunctiune])*12 + MONTH(r1.[PunereInFunctiune])+1 <= @An*12+@luna) AND --din luna urmatoare datei de punere in functiune
				(@An*12+@Luna <= YEAR(r1.[PunereInFunctiune])*12+MONTH(r1.[PunereInFunctiune]) + r1.[DurataAmortizare])
				AND r1.[CodUnitate]=@CodUnitate  
				AND r2.[IDStare]=5
		   GROUP BY b.[IDMFixPrincipal],r1.[ValoareInventar],r1.[DurataAmortizare],r1.[PunereInFunctiune])

			IF @@ERROR <>0 GOTO Eroare  	

		END	
	END
	
	Print('actualizeaza valorile pentru documentele compuse')
	--actualizeaza valorile pentru documentele compuse
	UPDATE [AmixDocumente] SET [ValoareInventar] = a.[ValoareInventar],
	[ValoareAmortizata] = a.[ValoareAmortizata]
	FROM [AmixRegistru] a WHERE [AmixDocumente].[CodUnitate]=@CodUnitate
	AND [AmixDocumente].[IDMijlocFix]=a.[IDMijlocFix] AND [AmixDocumente].[Luna]=@Luna AND [AmixDocumente].[Anul]=@An
	AND [AmixDocumente].[Compus]=1
	IF @@ERROR <>0 GOTO Eroare

	

	----Blocheaza amortizarea mijloacelor fixe care pleaca din gestiune
	----trece mijloacele in mijloace iesite
	Print('trece mijloacele in mijloace iesite')
	UPDATE [AmixRegistru] 
			SET [IDStare] = 2,[InFolosinta]=0
			FROM [AmixDocumente] d
		WHERE  
			d.[Anul] = @An AND d.[Luna]=@Luna AND d.[CodUnitate]=@CodUnitate AND d.[IDTipDocument]=3 AND d.[IDMijlocFix] = [AmixRegistru].[IDMijlocFix] AND d.[IDMijlocFix] IS NOT NULL
			AND (@IDDocument=0 OR [IDDocument]=@IDDocument)
	IF @@ERROR <>0 GOTO Eroare  
	-- Blocheaza amortizarile pentru mijloacele fixe care pleaca din gestiune
	Print('Blocheaza amortizarile pentru mijloacele fixe care pleaca din gestiune')
	UPDATE [AmixAmortizare] 
				SET [Blocat] = 1
				FROM [AmixDocumente] d
			WHERE  
				d.[Anul] = @An AND d.[Luna]=@Luna AND d.[CodUnitate]=@CodUnitate AND d.[IDTipDocument]=3 AND d.[IDMijlocFix] = [AmixAmortizare].[IDMijlocFix] AND d.[IDMijlocFix] IS NOT NULL
				AND (@IDDocument=0 OR [IDDocument]=@IDDocument)
				AND [AmixAmortizare].[An]*100 + [AmixAmortizare].[Luna] >= @An*100+@Luna
	IF @@ERROR <>0 GOTO Eroare  

	Print('Transfer intern, schimbare gestionar')
	----Transfer intern, schimbare gestionar
	UPDATE [AmixRegistru] 
			SET [IDDepartament] = d.[IDDepartament],
			[IDgestionar] = d.[IDGestionar]
			FROM [AmixDocumente] d
		WHERE  
			d.[Anul] = @An AND d.[Luna]=@Luna AND d.[CodUnitate]=@CodUnitate AND d.[IDTipDocument]=4 AND d.[IDMijlocFix] = [AmixRegistru].[IDMijlocFix] AND d.[IDMijlocFix] IS NOT NULL
			AND (@IDDocument=0 OR [IDDocument]=@IDDocument)
	IF @@ERROR <>0 GOTO Eroare  




	Print('Inchidere Luna')
	----------- inchidere luna
	IF @InchideLuna=1
	BEGIN
		DECLARE @azi DateTime
		SET @azi = CAST(CAST(@An as varchar(4)) + '-' + cast(@Luna as varchar(2)) + '-01' AS DateTime)
		UPDATE [AmixSetup] SET [LunaCurenta]= MONTH(DATEADD(month,1,@azi)),[AnulCurent]=YEAR(DATEADD(month,1,@azi))
		WHERE [CodUnitate]=@CodUnitate
		IF @@ERROR <>0 GOTO Eroare 
		SET @Luna = MONTH(DATEADD(month,1,@azi))
		SET @An = YEAR(DATEADD(month,1,@azi))


		Print('Schimba stare mijloace amortizate')
		UPDATE [AmixRegistru] SET [AmortizareLuna] = 0,[AmortizareAn]=0,[IDStare]=1
		WHERE 
		[AmixRegistru].[CodUnitate]=@CodUnitate  AND [ValoareAmortizata] + AmortizareLuna >= [ValoareInventar] AND  [ValoareAmortizata] >= [ValoareInventar]
		AND [IDStare]=5
		IF @@ERROR <>0 GOTO Eroare


		Print('actualizeaza in registru valoarea de inventar si valoare amortizata in ultima luna')
		UPDATE [AmixRegistru] SET [AmortizareLuna] = [ValoareInventar] - [ValoareAmortizata],
		[ValoareAmortizata] = [ValoareInventar],[LuniAmortizate] = DurataAmortizare
		WHERE 
		[AmixRegistru].[CodUnitate]=@CodUnitate  AND [ValoareAmortizata] + AmortizareLuna >= [ValoareInventar] AND  [ValoareAmortizata] < [ValoareInventar]
		AND [IDStare]=5
		IF @@ERROR <>0 GOTO Eroare


		Print('actualizeaza in registru valoarea de inventar si valoare amortizata')
		--actualizeaza in registru valoarea de inventar si valoare amortizata
		UPDATE [AmixRegistru] SET 
		[ValoareAmortizata] = [ValoareAmortizata]+AmortizareLuna,[LuniAmortizate] = [LuniAmortizate]+1
		WHERE 
		[AmixRegistru].[CodUnitate]=@CodUnitate AND [ValoareAmortizata]+AmortizareLuna <[ValoareInventar]
		AND [IDStare]=5
		IF @@ERROR <>0 GOTO Eroare


	
		EXEC [amix_InchideLuna2] @Luna,@An,@CodUnitate,0,0;
	END 
	COMMIT

	---inchidere luna

	GOTO Gata
	DUBLURI:
		RAISERROR ('Exista mijloace fixe cu acelasi numar de inventar',16,-1)
		GOTO Gata

	EROARE:
		ROLLBACK
		RAISERROR ('Eroare la prelucrarea datelor',16,-1)
		GOTO Gata

		GATA:
END